/*
 * layui的初始化模块可以理解为，引入这个模块的js文件
 * 值得注意的是：layui的模块之间存在依赖关系，例如引入了table模块，它会layui/lay/moudules/table.js
 * 这个文件引入进来，并且它还会将这个模块所依赖的其他模块自动加入进来，
 * 实际引入的模块有：table、form、jquery、layer、laypage、laytpl、util，7个js文件
 * 所以我仅仅初始化了table模块，却能获得form、jquery、layer的模块对象
 */
var pageSelectUrl = "sys/org/selectList";
var insertUrl = "sys/org/add";
var updateUrl = "sys/org/update";
var deleteUrl = "sys/org/delete";
//layui初始化表格模组
layui.use(['table'], function() {
	//获得模块对象
	var table = layui.table;
	var form = layui.form;
	var $ = layui.jquery;
	var layer = layui.layer;

	//数据表格渲染
	table.render({
		elem: '#dataTable',
		url: pageSelectUrl,
		method: 'get',
		where: {}, // 你额外要携带数据，以键值对的方式存入
		toolbar: '#myToolbar', // 开启头部工具栏，并为其绑定左侧模板
		cellMinWidth: 80, // 全局定义所有常规单元格的最小宽度（默认：60）
		cols: [
			[{
					type: 'numbers'
				} // 序号
				, {
					type: 'checkbox'
				} // 复选框
				, {
					field: 'orgId',
					title: '组织ID',
					hide: true
				}, {
					field: 'orgName',
					title: '组织名'
				}, {
					field: 'parentId',
					title: '父组织ID',
					hide: true
				}, {
					field: 'parentName',
					title: '父组织名'
				}, {
					field: 'subsetId',
					title: '组织类型ID',
					hide: true
				}, {
					field: 'subsetName',
					title: '组织类型名'
				}, {
					field: 'staffId',
					title: '负责人ID',
					hide: true
				}, {
					field: 'staffName',
					title: '负责人名'
				}, {
					field: 'orgLocation',
					title: '地址'
				}, {
					field: 'description',
					title: '描述'
				}, {
					fixed: 'right',
					align: 'center',
					title: '是否可用',
					width: 100,
					templet: '#checkboxTpl',
					unresize: true
				}
			]
		],
		page: true, // 开启分页
		limit: 10, // 每页显示的条数
		limits: [5, 10, 20, 50, 100], // 每页条数的选择项
		loading: true, // 是否显示加载条(切换分页的时候显示）
		title: '组织结构数据表' // 定义 table 的大标题（在文件导出等地方会用到）
		//id: 'dataTable', // 设定容器唯一 id
		//even: true // 隔行变色
	});

	//头部搜素表单提交
	form.on('submit(searchBtn)', function(data) {
		//console.log(data.elem) //被执行事件的元素DOM对象，一般为button对象
		//console.log(data.form) //被执行提交的form对象，一般在存在form标签时才会返回
		//console.log(data.field) //当前容器的全部表单字段，名值对形式：{name: value}
		//执行后台代码
		//刷新数据表格
		table.reload('dataTable', {
			where: data.field,
			url: pageSelectUrl
		});
		return false; //阻止表单跳转。如果需要表单跳转，去掉这段即可。
	});

	//新增表单提交
	form.on('submit(submitBtn)', function(data) {
		//console.log(data.elem) //被执行事件的元素DOM对象，一般为button对象
		//console.log(data.form) //被执行提交的form对象，一般在存在form标签时才会返回
		//console.log(data.field) //当前容器的全部表单字段，名值对形式：{name: value}
		//执行后台代码
		if($("#myModal").hasClass("addModal")) {
			submitFun({
				'obj': data,
				'submitType': "post",
				'submitUrl': insertUrl,
				'txt': "添加",
				'type': "insert"
			});
		} else if($("#myModal").hasClass("updateModal")) {
			submitFun({
				'obj': data,
				'submitType': "post",
				'submitUrl': updateUrl,
				'txt': "修改",
				'type': "update"
			});
		}
		return false; //阻止表单跳转。如果需要表单跳转，去掉这段即可。
	});

	form.on('select', function(data) {
		//console.log(data)
		//console.log($(data.elem).attr('id'))
		//console.log(data.elem) //被执行事件的元素DOM对象，一般为button对象
		//console.log($("select[name="+$(data.elem).attr('name')+"] option[value="+data.value+"]").text())
		$("input[name=" + $(data.elem).attr('id') + "]").val($("select[name=" + $(data.elem).attr('name') + "] option[value=" + data.value + "]").text());
		//console.log($("input[name="+$(data.elem).attr('id')+"]").val())
	});

	//头工具栏事件
	table.on('toolbar(dataTableEvent)', function(obj) { //console.log(obj)
		//获取当前表格选中状态和选中的数据
		var checkStatus = table.checkStatus(obj.config.id);
		//区分点击的按钮
		switch(obj.event) {
			case 'add':
				//弹出新增模态框
				initModal({
					'obj': 1,
					'type': 'add'
				});
				break;
			case 'update':
				isSelectTr(obj, "修改", 1, [{
					'funName': initModal,
					'parameter': {
						'obj': checkStatus.data[0],
						'type': 'update'
					}
				}]);
				break;
			case 'disabled':
				//选择的数据数量
				isSelectTr(obj, "禁用", -1, [{
					'funName': submitFun,
					'parameter': {
						'obj': checkStatus.data,
						'submitType': "post",
						'submitUrl': updateUrl,
						'txt': "禁用",
						'type': "isDisabled",
						'newVal': '0',
						'oldVal': '1'
					}
				}]);
				break;
			case 'regain':
				//选择的数据数量
				isSelectTr(obj, "恢复", -1, [{
					'funName': submitFun,
					'parameter': {
						'obj': checkStatus.data,
						'submitType': "post",
						'submitUrl': updateUrl,
						'txt': "恢复",
						'type': "isDisabled",
						'newVal': '1',
						'oldVal': '0'
					}
				}]);
				break;
			case 'remove':
				layer.confirm('删除后将无法找回，确定删除吗？', function() {
					isSelectTr(obj, "删除", -1, [{
						'funName': submitFun,
						'parameter': {
							'obj': checkStatus.data,
							'submitType': "DELETE",
							'submitUrl': deleteUrl,
							'txt': "删除",
							'type': "delete"
						}
					}]);
				});
				break;
		};
	});

	//关闭模态框 新增和修改模态框共用这个点击事件
	$(".modalClose").click(function() {
		//关闭页面上所有类型的所有弹框
		layer.closeAll();
		//closeModelData();
	});

	/*头部根据父组织名查询搜索框的下拉列表数据*/
	$("#parentNameInput input").click(function() {
		loadDataFormOption({
			'index': 0,
			'obj': [{
				'reqType': 'get',
				'reqUrl': pageSelectUrl,
				'value': 'orgId',
				'id': '#search-header',
				'txt': 'orgName',
				'name': 'parentId',
				'async': false
			}]
		});
	})

	//遍历选中行数
	function isSelectTr(datas, txt, row, arrayListMap) {
		//获取当前表格选中状态和选中的数据
		var checkStatus = table.checkStatus(datas.config.id); //console.log(checkStatus.data)
		//选择的数据数量
		if(typeof(row) != 'number' || row <= 0 || typeof(row) === 'undefined') {
			row = 999999;
		}
		if(typeof(txt) != 'string' || txt <= 0 || typeof(txt) === 'undefined') {
			txt = "修改";
		}
		//
		if(checkStatus.data.length > row) {
			layer.msg("最多只能选择" + row + "行进行" + txt, {
				icon: 3, //图标，可输入范围0~6
				time: 2500 //2秒关闭（如果不配置，默认是3秒）
			});
		} else if(checkStatus.data.length < 1) {
			layer.msg("请选择需要" + txt + "的行", {
				icon: 3, //图标，可输入范围0~6
				time: 2500 //2秒关闭（如果不配置，默认是3秒）
			});
		} else {
			$.each(arrayListMap, function(index, item) {
				if(typeof(item.funName) != 'function' || typeof(item.funName) === 'undefined') {
					item.funName = function(data) {};
				} else {
					if(typeof(item.parameter) === 'undefined') {
						item.parameter = null;
					}
					item.funName(item.parameter);
				}
			});
		}
	}

	//清空模态框数据
	function closeModelData() {
		$("#myModal select[name=parentId]").html("<option value=''></option>");
		$("#myModal select[name=subsetId]").html("<option value=''></option>");
		$("#myModal select[name=staffId]").html("<option value=''></option>");
	}

	//遍历id
	function eachIdStr(data) {
		//定义一个要删除的所有资源ID的字符串
		var idStr = "";
		//遍历传递过来的要删除的数据
		for(var i = 0; i < data.length; i++) {
			//拿出资源ID进行拼接
			idStr += data[i].orgId + ",";
		}
		//截取掉因为拼接产生的多余的一个逗号
		idStr = idStr.substring(0, idStr.length - 1);
		return idStr;
	}

	//遍历是否可用信息
	function eachUseable(data) {
		var num = 0;
		var names = "";
		for(var i = 0; i < data.obj.length; i++) {
			if(data.oldVal != data.obj[i].useable) {
				num++;
				names += data.obj[i].orgName + ", ";
			}
		}
		if(num == 0) {
			return 1;
		} else {
			layer.alert("已选中(" + names.substring(0, names.length - 2) + ")" + num + "个是已" + data.txt + "的，请检查！");
			return 0;
		}
	}

	//提交数据
	function submitFun(data) {
		var submitData;
		switch(data.type) {
			case "insert":
				submitReq({
					'obj': data,
					'submitData': data.obj.field
				});
				break;
			case "isDisabled":
				var returnData = eachUseable(data);
				if(returnData == 1) {
					submitReq({
						'obj': data,
						'submitData': {
							'orgId': eachIdStr(data.obj),
							'useable': data.newVal,
							'ifUseable': data.oldVal
						}
					});
				}
				break;
			case "update":
				submitReq({
					'obj': data,
					'submitData': data.obj.field
				});
				break;
			case "delete":
				var ids = eachIdStr(data.obj)
				submitData = {
					'orgIds': ids
				};
				data.submitUrl = data.submitUrl + "/" + ids;
				submitReq({
					'obj': data,
					'submitData': submitData
				});
				break;
			default:
				break;
		}
	}

	function submitReq(data) {
		//发送相应请求
		$.ajax({
			type: data.obj.submitType,
			url: data.obj.submitUrl,
			async: true,
			data: data.submitData,
			dataType: 'json',
			success: function(respData) {
				if(respData == 0) {
					layer.confirm(data.obj.txt + '失败！，请重试', function() {
						//重调函数
						submitReq(data);
					});
				} else {
					//刷新数据表格
					table.reload('dataTable', {
						url: pageSelectUrl
					});
					//关闭页面上所有类型的所有弹框
					layer.closeAll();
					layer.msg(data.obj.txt + "成功！共"+respData+"条", {
						icon: 1, //图标，可输入范围0~6
						time: 2500 //2秒关闭（如果不配置，默认是3秒）
					});
				}
			},
			error: function() {
				layer.confirm('请求失败！，请重试', function() {
					//重调函数
					submitFun(data);
				});
			}
		});
	}

	//初始化修改模态框
	var initModal = function(data) {
		var txt = "";
		if(data.type.indexOf("add") >= 0) {
			$("#myModal").removeClass("addModal").removeClass("updateModal").addClass("addModal");
			txt = "添加组织信息";
		} else if(data.type.indexOf("update") >= 0) {
			$("#myModal").removeClass("addModal").removeClass("updateModal").addClass("updateModal");
			txt = "修改组织信息";
			loadUpdateFormData(data.obj);
		}

		openModal({ //弹模态框调用方法模板（修改值即可）
			modalId: 'myModal', // 模态框id不用加 # 符号
			ajaxType: 'post', // ajax请求方式
			ajaxUrl: 'sys/org/'+data.type, // ajax请求地址
			ajaxAsync: true, // ajax是否异步请求
			reloadTabId: 'dataTable', // 刷新表数据的表 id 不用加 # 符号
			reloadTabUrl: pageSelectUrl, // 刷新表数据请求的url
			layOpen: { //把自己的layer.open()里面的东西复制进来
				type: 1, // 基本层类型0~4，1为页面层
				title: txt, // 标题
				area: ['400px', '550px'], // 宽高 只写一个参数就是表示宽度，高度会自适应
				content: $("#myModal"), // 文本、html都行
				anim: 0, // 弹出动画
				resize: false, // 是否允许拉伸
				btnAlign: 'c', //按钮居中
				btn: ['立即提交', '关闭'] //就两个按钮不用附带函数（!--注意：这个必须有--!）
			},
			selectList: [{ //下拉框加载（没有可不要/删掉）
					selectId: 'parentId', // select的 id 不用加 # 符号
					selectUrl: pageSelectUrl, // select的 请求的url
					selectType: 'get', // select请求方式
					optionVal: 'orgId', // option的 value的数据字段
					optionTxt: 'orgName' // soption的请求的内容字段
				},
				{
					selectId: 'subsetName', // select的 id 不用加 # 符号
					selectUrl: pageSelectUrl, // select的 请求的url
					selectType: 'get', // select请求方式
					optionVal: 'subsetId', // option的 value的数据字段
					optionTxt: 'subsetName' // soption的请求的内容字段
				},
				{
					selectId: 'staffName', // select的 id 不用加 # 符号
					selectUrl: pageSelectUrl, // select的 请求的url
					selectType: 'get', // select请求方式
					optionVal: 'staffId', // option的 value的数据字段
					optionTxt: 'staffName' // soption的请求的内容字段
				}
			],
			ifOk: {
				funName: okFun, // 提交成功回调函数名（不能是数字和字符串也不能带括号，有模板函数fun1/自定义）
				parameter: {'txt':txt} // 传入提交成功回调函数的参数json
			},
			ifErr: {
				funName: errFun, // 提交失败回调函数名（不能是数字和字符串也不能带括号，有模板函数fun2/自定义）
				parameter: {'txt':txt} // 传入提交失败回调函数的参数json
			},
			modalFormVerify: { // 校验（无校验可不要/删掉,建议:写校验函数,！--注意：该上传非submit提交，layui的表单校验无效--！）
				funName: verifyFun, // 校验函数名（不能是数字和字符串也不能带括号，返回值必须是true才能提交，有模板函数fun3/自定义）
				parameter: {} // 传入校验函数的参数json
			}
		})
	}

	function loadUpdateFormData(data) {
		//表单赋值
		form.val('dataForm', {
			"orgId": data.orgId,
			"orgName": data.orgName,
			"parentId": data.parentId,
			"parentName": data.parentName,
			"subsetId": data.subsetId,
			"subsetName": data.subsetName,
			"staffId": data.staffId,
			"staffName": data.staffName,
			"orgLocation": data.orgLocation,
			"description": data.description,
			"useable": data.useable
		});
	}

	// 提交成功回调函数模板
	function okFun(e) {
		if(e.respData == 0) {
			layer.msg(e.parameter.txt+"失败，请重试！", {
				icon: 5, //图标，可输入范围0~6
				time: 2500 //2秒关闭（如果不配置，默认是3秒）
			});
		} else {
			layer.closeAll();
			layer.msg(e.parameter.txt+"成功，共"+e.respData+"条", {
				icon: 1, //图标，可输入范围0~6
				time: 2500 //2秒关闭（如果不配置，默认是3秒）
			});
		}
		table.reload('dataTable', {
			url: pageSelectUrl
		});
	}

	// 提交失败回调函数模板
	function errFun(e) {
		layer.msg(e.parameter.txt+"，请重试！", {
			icon: 5, //图标，可输入范围0~6
			time: 2500 //2秒关闭（如果不配置，默认是3秒）
		});
	}

	// 表单校验函数模板
	function verifyFun() {
		var verifyOkNum = 0; //定义校验通过数量

		//自定义校验方法（修改即可）根据元素中my-verify的值进行校验没有可以自己添加（跟layui的一样写法）
		myVerify({
			orgName: function(value) {
				if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)) {
					return '组织名不能有特殊字符';
				} else if(/(^\_)|(\__)|(\_+$)/.test(value)) {
					return '组织名首尾不能出现下划线\'_\'';
				} else if(/^\d+\d+\d$/.test(value)) {
					return '组织名不能全为数字';
				}
				/* else if(从数据库查组织结构名函数的返回值（组织id） != 隐藏域里的组织结构id && 从数据库查组织结构名函数的返回值（组织id） != "") {
					return '该组织名已存在';
				}*/
				{
					verifyOkNum++;
					return null;
				}
			},
			orgLocation: function(value) {
				if(value != '') {
					verifyOkNum++;
					return null;
				} else {
					return "地址不能为空！";
				}
			},
			useable: function(value) {
				if(value != '' && value != null) {
					verifyOkNum++;
					return null;
				} else {
					return "是否可用不能为空！";
				}
			}
		});
		//
		if(verifyOkNum == 3) { //当校验通过数量==要校验的数量时返回true
			return true;
		} else {
			return false;
		}
	}

	//加载下拉框数据
	function loadDataFormOption(data) {
		if(data.index < data.obj.length) {
			$.ajax({
				type: data.obj[data.index].reqType,
				url: data.obj[data.index].reqUrl,
				async: data.obj[data.index].async,
				success: function(respData) {
					$.each(respData.data, function(e, obj) {
						var value = obj[key = data.obj[data.index].value];
						var txt = obj[key = data.obj[data.index].txt];
						var options = "";
						if(value != null && value != '') {
							options = "<option value='" + value + "'>"
						}
						if(txt != null && txt != '') {
							options = options + "" + txt + "</option>"
						}
						$(data.obj[data.index].id + " select[name=" + data.obj[data.index].name + "]").append(options);
					});
					data.index = data.index + 1;
					form.render(); //渲染将option添加进去
					loadDataFormOption(data);
				},
				error: function() {
					layer.msg("请求超时,请刷新重试!", {
						icon: 5, //图标，可输入范围0~6
						time: 2500 //2秒关闭（如果不配置，默认是3秒）
					});
				}
			});
		}
	}

	/*------------------打开模态框的主方法（放在layui.use(['table'], function() {}（必须要定义了var form = layui.form,layer = layui.layer,table = layui.table,$ = layui.jquery;）里面）不能私自修改，折叠起来-------------------------------------------------------------------*/
	function openModal(modalDatas) {
		if(typeof(modalDatas.selectList) !== 'undefined') {
			loadOption(modalDatas.selectList);
		}

		modalDatas.layOpen['btn1'] = function(index, layero) { //（btn1：‘立即提交’）   回调函数
			if(modalDatas.modalFormVerify != '' && typeof(modalDatas.modalFormVerify) !== 'undefined') {
				if(typeof(modalDatas.modalFormVerify.funName) === 'function' && modalDatas.modalFormVerify.funName(modalDatas.modalFormVerify.parameter) == true) {
					setModalAjaxData();
				} else {
					console.log('你的校验未通过！')
				}
			} else {
				setModalAjaxData();
			}
		};

		modalDatas.layOpen['btn2'] = function(index, layero) { //（btn2：‘关闭’） 回调函数
			//关闭页面上所有类型的所有弹框
			layer.closeAll();
		};

		modalDatas.layOpen['end'] = function() { // 弹出层销毁时的回调函数（不论何种方式，只要关闭了就执行）
			$("#" + modalDatas.modalId + " form")[0].reset();
			if(typeof(modalDatas.selectList) !== 'undefined') {
				claseOption(modalDatas.selectList); //在''里面填要清空的select的id
			}
		};

		layer.open(modalDatas.layOpen);

		function setModalAjaxData() {
			var formData = {};
			$.map($("#" + modalDatas.modalId + " form").serializeArray(), function(object, index) {
				formData[object['name']] = object['value'];
			});
			if(modalDatas.ajaxType == '' || typeof(modalDatas.ajaxType) === 'undefined') {
				modalDatas.ajaxType = 'post';
			}
			if(modalDatas.ajaxAsync == '' || typeof(modalDatas.ajaxAsync) === 'undefined') {
				modalDatas.ajaxAsync = true;
			}
			modalAjax({
				formData: formData,
				thisType: modalDatas.ajaxType,
				thisUrl: modalDatas.ajaxUrl,
				thisAsync: modalDatas.ajaxAsync,
				thisOkFun: {
					funName: modalDatas.ifOk.funName,
					parameter: modalDatas.ifOk.parameter
				},
				thisErrFun: {
					funName: modalDatas.ifErr.funName,
					parameter: modalDatas.ifErr.parameter
				}
			});
		}

		//提交表单函数
		function modalAjax(modalSubmitData) {
			$.ajax({
				type: modalSubmitData.thisType,
				url: modalSubmitData.thisUrl,
				async: modalSubmitData.ajaxAsync,
				data: modalSubmitData.formData,
				dataType: 'json',
				success: function(respData) {
					if(typeof(modalSubmitData.thisOkFun.funName) === 'function') {
						modalSubmitData.thisOkFun.funName({
							respData: respData,
							parameter: modalSubmitData.thisOkFun.parameter
						});
					}
				},
				error: function() {
					if(typeof(modalSubmitData.thisErrFun.funName) === 'function') {
						modalSubmitData.thisErrFun.funName(modalSubmitData.thisErrFun.parameter);
					}
				}
			});
		}

		function addOption(obj) {
			if(obj.respData != '' && typeof(obj.respData) != 'undefined') {
				$.each(obj.respData.data, function(index, o) {
					$("#" + modalDatas.modalId + " #" + obj.parameter.selectId).append(new Option(o[obj.parameter.optionTxt], o[obj.parameter.optionVal]));
				});
				form.render(); //渲染将option添加进去
			}
		}
		//清空select的option方法
		function claseOption(selectList) {
			if(typeof(selectList) !== 'undefined') {
				$.each(selectList, function(index, o) {
					if(o.selectId != '' && typeof(o.selectId) !== 'undefined') {
						$("#" + modalDatas.modalId + " #" + o.selectId).html("<option value=''></option>");
					}
				});
			}
		}

		function loadOptionErr() {
			layer.msg("请求超时，数据加载失败！", {
				icon: 5,
				time: 2500
			});
		}

		//清空select的option方法
		function loadOption(selectList) {
			$.each(selectList, function(index, o) {
				if(o.selectId != '' && typeof(o.selectId) != undefined) {
					if(o.selectType == '' || typeof(o.selectType) === 'undefined') {
						o.selectType = 'get';
					}
					modalAjax({
						formData: {},
						thisType: o.selectType,
						thisUrl: o.selectUrl,
						thisAsync: false,
						thisOkFun: {
							funName: addOption,
							parameter: o
						},
						thisErrFun: {
							funName: loadOptionErr
						}
					});
				}
			});
		}
	}
	/*------------------打开模态框的主方法（放在layui.use(['table'], function() {}（必须要定义了var form = layui.form,layer = layui.layer,table = layui.table,$ = layui.jquery;）里面）不能私自修改，折叠起来-------------------------------------------------------------------*/

	/*------------------自定义校验方法（调用即可，！--注意：不可私自修改--！）------------------------*/
	function myVerify(myVerifyData) { //自定义校验方法（调用即可，！--注意：折叠起来，不可私自修改--！）
		if(typeof(myVerifyData) !== 'undefined' && myVerifyData != '') {
			$.each(myVerifyData, function(name) {
				var myVerifyReturnVal = myVerifyData[name]($("*[my-verify=" + name + "]").val());
				if(myVerifyReturnVal !== null && typeof(myVerifyReturnVal) !== 'undefined') {
					//"<div style='position: relative'><span style='color: red; font-size: 12px; position: absolute;'>"+$("input[my-verify=" + name + "]").val()+"</span></div>"
					$("*[my-verify=" + name + "]").parent("div").find("input").css('border-color', 'rgb(255,87,34)');
					$("*[my-verify=" + name + "]").parent("div").find("input").next().remove();
					$("*[my-verify=" + name + "]").parent("div").find("input").parent().append("<div class='myVerifyErr' style='position: relative'><span style='color: red; font-size: 12px; position: absolute;'>" + myVerifyData[name]($("input[my-verify=" + name + "]").val()) + "</span></div>")
				}
			});
			setTimeout(removeMyVerifyErr, 2000);

			function removeMyVerifyErr() {
				$(".myVerifyErr").remove();
				$("form *[name!='button']").parent("div").find("input").css('border-color', 'rgb(230,230,230)');
			}
		}
	}
	/*------------------自定义校验方法（调用即可，！--注意：不可私自修改--！）------------------------*/
});